<html>
  <head>
    <meta charset="utf-8" />
<meta name="description" content="" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>开发中可以避免的问题 | Jiang</title>
<link rel="shortcut icon" href="https://cherrylover.github.io/favicon.ico?v=1601447716515">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
<link rel="stylesheet" href="https://cherrylover.github.io/styles/main.css">

<script src="https://cdn.bootcss.com/highlight.js/9.12.0/highlight.min.js"></script>
<script src="https://cdn.bootcss.com/moment.js/2.23.0/moment.min.js"></script>


<script async src="https://www.googletagmanager.com/gtag/js?id=UA-143284233-1"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'UA-143284233-1');
</script>

  </head>
  <body>
    <div class="main">
      <div class="main-content">
        <div class="site-header">
  <a href="https://cherrylover.github.io">
  <img class="avatar" src="https://cherrylover.github.io/images/avatar.png?v=1601447716515" alt="">
  </a>
  <h1 class="site-title">
    Jiang
  </h1>
  <p class="site-description">
    我允许你走进我的世界，但不许你在我的世界里走来走去。
  </p>
  <div class="menu-container">
    
      
        <a href="/" class="menu">
          首页
        </a>
      
    
      
        <a href="/archives" class="menu">
          归档
        </a>
      
    
      
        <a href="/tags" class="menu">
          标签
        </a>
      
    
      
        <a href="https://cherrylover.github.io/post/guan-yu-wo/" class="menu">
          关于
        </a>
      
    
  </div>
  <div class="social-container">
    
      
        <a href="https://github.com/CherryLover" target="_blank">
          <i class="fab fa-github"></i>
        </a>
      
    
      
    
      
        <a href="https://juejin.im/user/576d73cd0a2b58006a09ad87" target="_blank">
          <i class="fab fa-weibo"></i>
        </a>
      
    
      
    
      
    
  </div>
</div>

      
        <div class="post-detail">
          <article class="post">
            <h2 class="post-title">
              开发中可以避免的问题
            </h2>
            <div class="post-info">
              <time class="post-time">
                · 2018-09-11 ·
              </time>
              
                <a href="https://cherrylover.github.io/tag/fZN0895-D/" class="post-tags">
                  # 编码技巧
                </a>
              
            </div>
            
              <div class="post-feature-image" style="background-image: url('https://monster-image-backup.oss-cn-shanghai.aliyuncs.com/picgo/Code_improve_compress.jpg')">
              </div>
            
            <div class="post-content">
              <p>本文题图：Photo by Samuel Zeller on Unsplash</p>
<p>做 Android 开发马上已经一年了，虽然中间有些磕磕绊绊，但总体来说还算是不小的进步，从编码技巧到规范上有些自己的想法，这些想法有些成为了自己的编码规范。持续更新……</p>
 <!-- more -->
<p><strong>强烈推荐阿里开源的代码检查规范</strong></p>
<h1 id="java">Java</h1>
<ol>
<li>空指针异常，不要想当然的以为一个对象不会为空，在使用 <code>equal</code> 的时候，将常量放在左边。判断是非为空也将常量放在左边；</li>
<li>重写类的 equals 方法也要重写类的 hashCode 方法；</li>
<li>数据类重写 <code>toString()</code> 方法；</li>
<li>StringBuffer 比 StringBuilder 更高效，同时也是线程安全的。但是 StringBuilder 在单线程下比 StringBuffer 更高效。</li>
<li>在进行除法运算的时候一定要判断除数不能为0；</li>
<li>涉及到字符串比较注意是否考虑中英文以及大小写；</li>
<li><code>String.valueOf(new Object())</code> 可能返回一个 <code>null</code> 字符串</li>
<li>字符串截取的时候，必须要判断长度是否足够截取；</li>
<li>文件复制后建议校验文件完整性；</li>
<li>List addAll 方法得到的 List 只要不将其中的对象取出来进行修改，原 List 中的数据不会改变，原因：List 的内存地址不同，但是 List 元素的地址相同，可以进行 remove(index)、remove(object)、add(object)操作；</li>
<li>随机数 nextInt()，其中的范围数<strong>只能为正数</strong>;</li>
<li>一个类非 static 修饰的成员变量，在其他 子类实例化时，都会开辟一个新的内存空间进行存放，所以，父类 A 中的 List 不为空时，B 类中 List 可能为空。</li>
<li>list 的 foreach 循环不能在其中进行修改元素，会报错，也不能向其中添加以及存在的 item；</li>
<li>在 List 中使用多次 remove ，由于 i 在不停的增大，Size 也在不停的减小，故达不到效果，可采用 list.subList().clear；</li>
</ol>
<h1 id="android">Android</h1>
<ol>
<li>
<p>EditText 设置单行 maxLines 无效的情况下可以使用 SingleLine=&quot;true&quot;</p>
</li>
<li>
<p>TextView.setText() 是不能存放 int 类型的值如果存入 int 类型的值回被系统认定为 资源文件，如果要存只能是字符串;</p>
</li>
<li>
<p>设置输入框不弹出软键盘，可以使用 EditText.setInputType(InputType.Null);</p>
</li>
<li>
<p>使用图片集来实现动画时， drawable list 的形式，太过占用内存，使用 <code>FrameAnimation</code> 构建动画，大大缓解内存占用 <a href="https://github.com/ansen360/FrameAnimation">低内存帧动画</a>;</p>
</li>
<li>
<p>RecyclerView 优化：</p>
</li>
<li>
<p>减少布局层级，避免过多的 Item View 的无用布局的嵌套；</p>
</li>
<li>
<p>对于有图片的列表，在滑动时不进行加载图片，停止滑动之后再加载图片；</p>
</li>
<li>
<p>避免在 Adapter 的填充数据时做过多的计算，或嵌套过多的逻辑计算，对于复杂的计算结果应当在 Adapter 填充数据之前计算完成，例如将 String 转为 SpannableString 的计算过程就可以放在 java bean 中进行实现；</p>
</li>
<li>
<p>点击事件可以放在 ViewHolder 中，onBindView 只做数据的绑定渲染；</p>
</li>
<li>
<p>减少 onMeasure() 和 onLayout() 的次数，可以使用一个弱引用的缓存数组和实现 View 对象的缓存。</p>
</li>
<li>
<p>BufferKinfe 如果出现问题，一个是 没导包 compiler 一个是包名异常，以 <code>java</code>、<code>Android</code> 开头了。</p>
</li>
<li>
<p>ADB 内网调试（Windows 下）：</p>
<ol>
<li>使用 USB 连接到设备，如果连接不上，可使用豌豆荚或其他第三方软件进行连接；</li>
<li>进入欲控制的 adb shell ；</li>
<li>进入设备控制台之后输入：<code>setprop service.adb.tcp.port 5555</code></li>
<li>拔掉 USB ，查看设备内网 IP 地址；</li>
<li>adb connect &lt;IP地址&gt;</li>
<li>如连接不成功，关闭开发者选项，再打开（如果是国内第三方 ROM 可以将其他的一些设置打开）。</li>
<li>使用步骤 5 再来一次，如果还是不行，从 步骤 2 再来一次。</li>
</ol>
</li>
<li>
<p>RecyclerView 如果使用 notifyItemRemove();这个方法，虽然数据与视图都有变动，但移除的 item 后的 item position 还是没有产生变化，需要再次调用 notifyItemChanged() 这个方法；</p>
<pre><code class="language-java">notifyItemRemoved(position);
notifyItemRangeChanged(position, getItemCount() - position);
</code></pre>
</li>
<li>
<p>动态添加 RadioButton 时布局文件一定不能有父布局，否则，单选变多选；</p>
</li>
<li>
<p>RecycleView 或是 ListView、GridView 等 Adapter View 如果实现了缓存机制，在涉及到多种状态的情况下，务必及时保存当前的状态信息。例如 CheckBox、RadioButton、EditText  将当前的状态写入到所属对象中，如果所属对象不能进行添加数据，考虑使用 Map 或 SparseArray 进行状态信息保存；</p>
</li>
<li>
<p>OnBackPressd 不一定被调用，但是监听 OnKeyDown 一定能监听到 返回键；onBackPressed 方法可能跟 super 有关；</p>
</li>
<li>
<p>引用第三方的 SDK 出现问题，先去检查一下基本配置，如包名之类的，再去检查一下手机的设置，是否部分权限没有打开。</p>
</li>
<li>
<p>RecyclerView Item 布局显示异常，可能跟 ItemView 的创建有关，使用 LayoutInflater. inflate 第二个方法不为空试试。</p>
</li>
</ol>

            </div>
          </article>
        </div>
    
        
          <div class="next-post">
            <div class="next">下一篇</div>
            <a href="https://cherrylover.github.io/post/cong-tu-pian-shang-chuan-jiang-dao-http/">
              <h3 class="post-title">
                从图片上传讲到HTTP
              </h3>
            </a>
          </div>  
        

        
          
            <link rel="stylesheet" href="https://unpkg.com/gitalk/dist/gitalk.css">
<script src="https://unpkg.com/gitalk/dist/gitalk.min.js"></script>

<div id="gitalk-container"></div>

<script>

  var gitalk = new Gitalk({
    clientID: 'f5cc70d7d50fba65cf69',
    clientSecret: '1d018e38ce9cdd399682bdd76690decfef00a051',
    repo: 'CherryLover.github.io',
    owner: 'CherryLover',
    admin: ['CherryLover'],
    id: location.pathname,      // Ensure uniqueness and length less than 50
    distractionFreeMode: false  // Facebook-like distraction free mode
  })

  gitalk.render('gitalk-container')

</script>

          

          
        
    
        <div class="site-footer">
  Powered by <a href="https://github.com/getgridea/gridea" target="_blank">Gridea</a>
</div>

<script>
  hljs.initHighlightingOnLoad()
</script>

      </div>
    </div>
  </body>
</html>
